package won.protocol.rest; import org.apache.jena.query.Dataset; import org.apache.jena.riot.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.util.StopWatch; import won.protocol.util.RdfUtils; import java.io.IOException; import java.util.Arrays; import java.util.List; /** * User: fsalcher * Date: 15.09.2014 */ public class RdfDatasetConverter extends AbstractHttpMessageConverter<Dataset> { private static final Logger logger = LoggerFactory.getLogger(RdfDatasetConverter.class); private static final MediaType[] supportedMediaTypes = { RDFMediaType.APPLICATION_TRIG, RDFMediaType.APPLICATION_JSONLD, RDFMediaType.APPLICATION_NQUADS }; public RdfDatasetConverter() { this(supportedMediaTypes); } public RdfDatasetConverter(MediaType supportedMediaType) { super(supportedMediaType); } public RdfDatasetConverter(MediaType... supportedMediaTypes) { super(supportedMediaTypes); } @Override protected boolean supports(Class<?> clazz) { return Dataset.class.isAssignableFrom(clazz); } @Override protected Dataset readInternal(Class<? extends Dataset> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException { Lang rdfLanguage = mimeTypeToJenaLanguage(httpInputMessage.getHeaders().getContentType(), Lang.TRIG); return RdfUtils.toDataset(httpInputMessage.getBody(), new RDFFormat(rdfLanguage)); } @Override protected void writeInternal(Dataset dataset, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException { StopWatch stopWatch = new StopWatch(); stopWatch.start(); MediaType contentType = httpOutputMessage.getHeaders().getContentType(); Lang rdfLanguage = mimeTypeToJenaLanguage(contentType, Lang.TRIG); WonEtagHelper.setMediaTypeForEtagHeaderIfPresent(contentType, httpOutputMessage.getHeaders()); RDFDataMgr.write(httpOutputMessage.getBody(), dataset, rdfLanguage); //append content type to ETAG header to avoid confusing different representations of the same resource httpOutputMessage.getBody().flush(); stopWatch.stop(); logger.debug("writing dataset took " + stopWatch.getLastTaskTimeMillis() + " millls"); } private static Lang mimeTypeToJenaLanguage(MediaType mediaType, Lang defaultLanguage) { Lang lang = RDFLanguages.contentTypeToLang(mediaType.toString()); if (lang == null) return defaultLanguage; return lang; } public List<MediaType> getSupportedMediaTypes(){ return Arrays.asList(supportedMediaTypes); } }